﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Xml;
using System.ComponentModel;
using System.Reflection;
using MAntLibrary;

namespace MAnt3
{
    /// <summary>
    /// Trida definuje veskerou praci s XML
    /// </summary>
    public class GenerovaniXml
    {
        #region TRIDNI PROMENNE
        public Konfigurace konfigurace;
        readonly BackgroundWorker PYTLIN;
        readonly IOproudy ioproudy;
        private IDodavatel DODAVATEL;
        private string timeStamp;
        MainWindow mainWindows;
        #endregion

        #region KONSTRUKTOR
        public GenerovaniXml(MainWindow mw, Konfigurace kon, BackgroundWorker f, IOproudy io, IDodavatel dod)
        {
            mainWindows = mw;
            konfigurace = kon;
            PYTLIN = f;
            ioproudy = io;
            DODAVATEL = dod;
            timeStamp = DateTime.Now.ToString("hh-mm-ss", CultureInfo.InvariantCulture);
        }
        #endregion

        #region METODY

        public void VytvorXml(string directoryPATH, string znacka,List<ZboziNetDirect> ZboziNetDirList)
        {
            // kontrolni vypis
            PYTLIN.ReportProgress(2,"MSG");
            PYTLIN.ReportProgress(5, "MAX");
            
            //generuju xmlka
            generujZBOZIxml(directoryPATH, znacka, ZboziNetDirList);
            PYTLIN.ReportProgress(1,"INK");

            generujZARAZENI_ZBOZIxml(directoryPATH, znacka, ZboziNetDirList);
            PYTLIN.ReportProgress(1,"INK");

            generujSKLADOVA_DOSTUPNOST(directoryPATH, znacka, ZboziNetDirList);
            PYTLIN.ReportProgress(1,"INK");

            generujCENA_ZBOZI(directoryPATH, znacka, ZboziNetDirList);
            PYTLIN.ReportProgress(1,"INK");

            // generuju parametry
            DODAVATEL.GenerujParametry(directoryPATH, znacka, ZboziNetDirList, timeStamp);
            PYTLIN.ReportProgress(1, "INK");

            // kontrolni vypis
            PYTLIN.ReportProgress(3,"MSG");
        }

        #region HLAVNI METODY - SPOLECNE
        private void generujZBOZIxml(string path, string znacka,List<ZboziNetDirect> ZboziNetDirList)
        {
            string filename = "\\" + znacka + "-" + "Zbozi" + "-" + timeStamp + ".xml";
            FileStream fs = new FileStream(path + filename, FileMode.Create);
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;

            XmlWriter w = XmlWriter.Create(fs, settings);

            w.WriteStartDocument();
            w.WriteStartElement("zbozi");
            w.WriteAttributeString("manufacturer", "netdirect");
            w.WriteAttributeString("version", "09.01");
            w.WriteAttributeString("bVlozit", "1");
            w.WriteAttributeString("bOpravit", "1");
            w.WriteAttributeString("bKompletniXml", "1");

            //cyklus
            foreach (ZboziNetDirect z in ZboziNetDirList)
            {
                w.WriteStartElement("zaznam");

                w.WriteElementString("sIdZbozi", z.IdZbozi);                //8834
                w.WriteElementString("sKodZbozi", z.KodZbozi);              //sassa0037
                w.WriteElementString("sJmenoVyrobku", z.JmenoVyrobku);      //35060 dámská vyztužená košilka Sassa Mode
                w.WriteElementString("sKratkyPopis", z.KratkyPopis);        //35060 dámská vyztužená košilka Sassa Mode
                w.WriteElementString("sPopis", z.Popis);                    //Dámská košilka 35060 značky Sassa Mode.Košilka s vyztuženými košíčky,skvěle drží poprsí.Košilka s úzkými ramínky. ložení:92%PA+8%EL
                w.WriteElementString("sJmenoVyrobce", z.JmenoVyrobce);      //Sassa - i pro kypré tvary</sJmenoVyrobce>
                w.WriteElementString("nZarukaMesicu", z.ZarukaMesicu);      //24
                w.WriteElementString("nDph", z.Dph);                        //20
                w.WriteElementString("sDostupnost", z.Dostupnost);          //E
                w.WriteElementString("sDostupnostNazev", z.DostupnostNazev);//do 20 pracovních dnů
                w.WriteElementString("sDostupnostPopis", z.DostupnostPopis);//Dodáme do max.20 pracovních dnů
                w.WriteElementString("sJmenoObrazku", z.getJmenoObrazku(0));//8b3b493aea56c0f48fbdd28773b896ba.png
                w.WriteElementString("bAkcni", z.Akcni);
                w.WriteElementString("bNejprodavanejsiKategorie", z.NejprodavanejsiKategorie);
                w.WriteElementString("bNejprodavanejsiEshop", z.NejprodavanejsiEshop);
                w.WriteElementString("bNovinka", z.Novinka);
                w.WriteElementString("bTip", z.Tip);
                w.WriteElementString("nZboziPoradi", z.ZboziPoradi);
                w.WriteElementString("nAkcniPoradi", z.AkcniPoradi);
                w.WriteElementString("nNejprodKategPoradi", z.NejprodKategPoradi);
                w.WriteElementString("nNejprodEshopPoradi", z.NejprodEshopPoradi);
                w.WriteElementString("nNovinkaPoradi", z.NovinkaPoradi);
                w.WriteElementString("nTipPoradi", z.TipPoradi);
                w.WriteElementString("bVypnout", z.Vypnout);
                w.WriteElementString("nDefaultMnozstviDoKosiku", z.DefaultMnozstviDoKosiku);

                // neni potreba generovat do XML pokud se to v shopu nepouziva
                //w.WriteElementString("sEan", "");                      //0
                //w.WriteElementString("sProductNo", "0");               //0

                w.WriteEndElement();
            }

            w.WriteEndElement();
            w.WriteEndDocument();
            w.Flush();
            fs.Close();
        }

        private void generujZARAZENI_ZBOZIxml(string path, string znacka,List<ZboziNetDirect> ZboziNetDirList)
        {
            string filename = "\\" + znacka + "-" + "Zarazeni_zbozi" + "-" +timeStamp+ ".xml";
            FileStream fs = new FileStream(path + filename, FileMode.Create);
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;

            XmlWriter w = XmlWriter.Create(fs, settings);

            w.WriteStartDocument();
            w.WriteStartElement("kategoriezbozi");
            w.WriteAttributeString("manufacturer", "netdirect");
            w.WriteAttributeString("version", "09.01");
            w.WriteAttributeString("bVlozit", "1");
            w.WriteAttributeString("bOpravit", "1");
            w.WriteAttributeString("bKompletniXml", "1");

            //cyklus
            foreach (ZboziNetDirect z in ZboziNetDirList)
            {
                w.WriteStartElement("zaznam");
                w.WriteElementString("sIdZbozi", z.IdZbozi);
                w.WriteElementString("sIdKategorie", z.Kategorie.Id);
                w.WriteElementString("bVypnout", z.Vypnout);

                w.WriteEndElement();
            }

            w.WriteEndElement();
            w.WriteEndDocument();
            w.Flush();
            fs.Close();
        }

        private void generujSKLADOVA_DOSTUPNOST(string path, string znacka,List<ZboziNetDirect> ZboziNetDirList)
        {
            string filename = "\\" + znacka + "-" + "Skladova_dostupnost" + "-"+ timeStamp + ".xml";
            FileStream fs = new FileStream(path + filename, FileMode.Create);
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;

            XmlWriter w = XmlWriter.Create(fs, settings);

            w.WriteStartDocument();
            w.WriteStartElement("skladovadostupnost");
            w.WriteAttributeString("manufacturer", "netdirect");
            w.WriteAttributeString("version", "09.01");
            w.WriteAttributeString("bOpravit", "1");
            w.WriteAttributeString("bKompletniXml", "1");
            w.WriteAttributeString("sIdZbozi", "sKodZbozi");

            //cyklus
            foreach (ZboziNetDirect z in ZboziNetDirList)
            {
                w.WriteStartElement("zaznam");

                w.WriteElementString("sIdZbozi", z.IdZbozi);
                w.WriteElementString("sDostupnost", z.Dostupnost);
                w.WriteElementString("sDostupnostNazev", DostupnostNazev(z.Dostupnost));
                w.WriteElementString("sDostupnostPopis", DostupnostPopis(z.Dostupnost));
                w.WriteElementString("bVypnout", "0");

                w.WriteEndElement();
            }

            w.WriteEndElement();
            w.WriteEndDocument();
            w.Flush();
            fs.Close();
        }

        private void generujCENA_ZBOZI(string path, string znacka,List<ZboziNetDirect> ZboziNetDirList)
        {
            string filename = "\\" + znacka + "-" + "Cena_zbozi" + "-" +timeStamp+ ".xml";
            FileStream fs = new FileStream(path + filename, FileMode.Create);
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;

            XmlWriter w = XmlWriter.Create(fs, settings);

            w.WriteStartDocument();
            w.WriteStartElement("ceny");
            w.WriteAttributeString("manufacturer", "netdirect");
            w.WriteAttributeString("version", "09.01");
            w.WriteAttributeString("bVlozit", "1");
            w.WriteAttributeString("bOpravit", "1");
            w.WriteAttributeString("bKompletniXml", "1");

            //cyklus
            foreach (ZboziNetDirect z in ZboziNetDirList)
            {
                w.WriteStartElement("zaznam");

                w.WriteElementString("sIdZbozi", z.IdZbozi);
                w.WriteElementString("sIdCeniku", "41");
                w.WriteElementString("sKodMeny", "CZK");
                w.WriteElementString("nCena", z.NovaCena);
                w.WriteElementString("nDoporucenaCena", z.NovaCena);
                w.WriteElementString("bVypnout", z.Vypnout);

                w.WriteEndElement();
            }

            w.WriteEndElement();
            w.WriteEndDocument();
            w.Flush();
            fs.Close();
        }
        #endregion

        #endregion
        
        #region VYTVORENI DB
        //
        // vytvorim databazi jiz zpracovanych produktu
        // [ulozim kratky popis, dlouhy popis, kategorii a nazev]
        //
        public void vytvorDBProduktu1(List<DbProduktu> dbProduktu, string znacka)
        {
            // vypis
            PYTLIN.ReportProgress(dbProduktu.Count, "VAL1");
            PYTLIN.ReportProgress(8,"MSG");
            PYTLIN.ReportProgress(dbProduktu.Count,"MAX");

            string path = string.Empty;
            XmlElement node;
            //bool existuje = false;

           
            path =  konfigurace.MantSettingsPath + konfigurace.MantCestaKdb +@"\"+znacka+".xml";
            if (!File.Exists(path)) { IOproudy.VytvorStrukturuDb(path); }           

            XmlDocument doc = new XmlDocument();
            try { doc.Load(path); }
            catch(Exception e)
            {
                IOproudy.PridejChybu(MethodInfo.GetCurrentMethod().Name, e.ToString(), DateTime.Now);
                return;
            }

            XmlNode root = doc.DocumentElement;

            foreach (DbProduktu p in dbProduktu)
            {
                foreach (XmlNode child in root.ChildNodes)
                {
                    string a = child.Attributes["nazev"].Value;
                    string b = p.Nazev;
                    if (a.Equals(b))
                    {
                        // smazu stary neaktualizovany uzel
                        root.RemoveChild(child);
                        //existuje = true;
                        break;
                    }
                }

                //if (!existuje)
                //{
                    // vlozim novy uzel
                    node = doc.CreateElement("item");
                    node.SetAttribute("id", p.Id);
                    node.SetAttribute("nazev", p.Nazev);
                    node.SetAttribute("kratkyPopis", p.KratkyPopis);
                    node.SetAttribute("dlouhyPopis", p.DlouhyPopis);
                    node.SetAttribute("kategorie", p.Kategorie);
                    root.AppendChild(node);
                //}
                //else
                //{
                //    // nahradim novym aktualizovanym
                //    node = doc.CreateElement("item");
                //    node.SetAttribute("id", p.Id);
                //    node.SetAttribute("nazev", p.Nazev);
                //    node.SetAttribute("kratkyPopis", p.KratkyPopis);
                //    node.SetAttribute("dlouhyPopis", p.DlouhyPopis);
                //    node.SetAttribute("kategorie", p.Kategorie);
                //    root.AppendChild(node);
                //}
                //existuje = false;
                PYTLIN.ReportProgress(1, "INK");
            }
             // ulozim zmeny
             doc.Save(path);
             PYTLIN.ReportProgress(3, "MSG");
        }

        //
        // metoda stejna jako vytvorDBProduktu1, ale s pouzitim XPath
        // [je to pomalejsi varianta]
        //
        public void vytvorDBProduktu2(List<Obrazek> dbProduktu, string znacka)
        {
            string path = string.Empty;
            bool existuje = false;

            //if (znacka.Equals("Vienetta"))
            //{
            //    string temp = konfigurace.MantCestaKdb + Settings.Default.vienettaDBpath;
            //    if(!File.Exists(temp)){ mainwindow.VytvorStrukturuDb(temp);}
            //    path = temp;
            //}
            //else if (string.IsNullOrEmpty(znacka))
            //{
            //}

            XmlDocument doc = new XmlDocument();
            try { doc.Load(path); }
            catch {
                
                return;
            }

            XmlNode root = doc.DocumentElement;
            XmlElement node;
            XmlNode item = doc.SelectSingleNode("MAnt");

            foreach (Obrazek o in dbProduktu)
            {
                // Vytvorim XPath
                string XPath = @"//item[@nazev='" +o.Cesta+ @"']";
                XmlNodeList list = doc.SelectNodes(XPath);

                // pokud je list prazdny znamena to, ze nebyla nalezena shoda
                if (list.Count == 0)
                {
                    node = doc.CreateElement("item");
                    node.SetAttribute("nazev", o.Cesta);
                    node.SetAttribute("kratkyPopis", o.Nazev);
                    node.SetAttribute("dlouhyPopis", o.Nazev2);
                    node.SetAttribute("kategorie", o.Kategorie);
                    item.AppendChild(node);
                }
            }

            // ulozim zmeny
            doc.Save(path);
        }
        #endregion

        #region POMOCNE METODY
        public string DostupnostPopis(string p)
        {
            if (p.Equals("Na objednávku"))      { return "není na skladu"; }
            else if (p.Equals("Poslední kus"))  { return "1-2 ks skladem"; }
            else if (p.Equals("Skladem"))       { return "více jak 2ks skladem"; }
            else { return "není na skladu"; }
        }

        public string DostupnostNazev(string p)
        {
            if (p.Equals("Na objednávku"))  { return "není na skladu"; }
            if (p.Equals("Poslední kus"))   { return "1-2 ks skladem"; }
            if (p.Equals("Skladem"))        { return "více jak 2ks skladem"; }
            else { return "není na skladu"; }
        }
        #endregion
    }
}